/**
 * @brief 定义事件类型
 * @version 1.0
 * @author 宋炜
 * @date 2023-08-25
 */

#pragma once
#include <sstream>
#include <functional>

#include "mallocSharedPtr.hpp"

struct mandaravaEvt
{
	using buff_t = wheels::mallocSharedPtr< uint8_t >;
	
	mandaravaEvtID    m_id;           // 事件类型
	dataCh          * p_ch;           // 事件发生的对象指针

	buff_t            m_buff;         // 数据缓冲

	mandaravaEvt( mandaravaEvtID id , dataCh * ch ):m_id( id ), p_ch( ch ){};

	mandaravaEvt( mandaravaEvt&& b ):m_id( b.m_id),p_ch( b.p_ch ), m_buff( std::move( b.m_buff )){}

	std::size_t operator( const mandaravaEvt& obj ){
		std::size_t ret = 0;
		std::stringstream ss;

		ss << m_id << ":" << std::hex << (unsigned int )p_ch;

		ret = std::hash< std::string >( ss.str() );
		return ret;
	}
};

namespace std
{
	// 定义hash用于在命令模块中注册自定义的事件
	template<>
	struct hash<MyClass> {
		std::size_t operator()(const MyClass& obj) const {
			return obj(obj);
		}
	};
}
